﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once
#include "GcmpMathInterface.h"
#include "GbmpTypeDefs.h"

namespace gcmp
{

    /// \brief 二维整型向量的基本定义
    ///
    /// 
    class GCMP_MATH_INTERFACE_EXPORT Vector2i
    {
    public:
        DEFINE_VISUAL_TYPE_INT32(gcmp::IntBaseType::Dec)

        /// \brief  默认构造函数
        ///
        Vector2i();

        /// \brief   通过长度为2的数组构造二维向量
        ///
        /// \param vec  长度为2的数组
        /// 
        explicit Vector2i(int vec[2]);

        /// \brief   通过向量的X和Y分量构造二维向量
        ///
        /// \param x  X分量
        /// \param y  Y分量
        /// 
        Vector2i(int x, int y);

        /// \brief   拷贝构造函数
        ///
        /// \param src  另一个Vector2
        /// \return 
        Vector2i(const Vector2i& src);

        /// \brief  获取X值
        ///
        /// \return  X值
        int X() const;

        /// \brief  获取Y值
        ///
        /// \return  Y值
        int Y() const;

        /// \brief  获取X值的引用
        ///
        /// \return  X值的引用
        int& X();

        /// \brief  获取Y值的引用
        ///
        /// \return  Y值的引用
        int& Y();

        /// \brief  设置XY值
        ///
        /// \param x  X值
        /// \param y  Y值
        /// \return true:成功， false: 失败
        bool Set(int x, int y);

        /// \brief  按照索引获取向量的分量
        ///
        /// \param nIndex 索引，由调用者确保分量索引的有效性
        /// \return向量分量值
        int& operator[](int nIndex);

        /// \brief  按照索引获取向量的分量
        ///
        /// \param nIndex 索引，由调用者确保分量索引的有效性
        /// \return向量分量值
        int operator[](int nIndex) const;

    private:
        int m_xy[2];
    };

    /// \brief  判断两向量是否相等
    ///
    /// \param v1 向量
    /// \param v2 另一向量
    /// \return true: 相等， false:不等
    GCMP_MATH_INTERFACE_EXPORT bool operator ==(const Vector2i & v1, const Vector2i & v2);

} // namespace





